// ts中的类型分类: 内置类型（DOM, Promise 原始方法）基础类型，高级类型，自定义类型
// ts中:后面的都是类型 = 后面的都是值（在js语法中）
// 1.ts一切从安全的角度出发，看能不能赋值 就看安全不安全
// 2.ts在编写的时候 代码是没有执行的
// 3.ts还有自动的类型推导，不用见到变量就写类型而是推断的不正确才需要自己比那些

let name = "ffff";

// 大写的类型都是包装类
let s1: string = "abc";
// let s2:string = new String(); // 这个写法不对
let s3: String = new String("abc");
let s4: String = "abc";

let arr1: number[] = [1, 2, 3];
let arr2: string[] = ['1', '2', '3'];
let arr3: (number | string)[] = [1, '2', 3];
let arr4: Array<number | string> = [1, '2', 3];

// 规定长度和存储的类型
let tuple1 = ['jiangwen', 30, true];

class Dog {
}
// 如果不需要对象，只是使用值，可以采用常量枚举，否则使用普通枚举
const enum USER_ROLE {
    USER,
    ADMIN = 6,
    MANAGER
}
console.log(USER_ROLE.USER);
// 一般情况下都是严格模式 null和undefined 只能赋给null 和 undefined
let str: string = '';
// void 代表函数的返回值为空， 只在函数中使用
function fn(): void { }
// never类型
// 任何类型的子类型
function fn1() {
    while (true) { }
}
// 类型保护：保障程序的不缺失 完整性
// 针对不同的类型做不同的处理
function validate(val: never) { }
function getResult(param: string | number | boolean) {
    //   typeof 可以有收窄的功能
    if (typeof param === 'string') {
        return param
    }
    if (typeof param === 'number') {
        return param
    }
    if (typeof param === 'boolean') {
        return param
    }
    validate(param)
}

let sym1: symbol = Symbol.for("1");
let sym2: symbol = Symbol.for("1");
console.log(sym1 === sym2);

// string number boolean null undefined array tuple never object symbol bigint any void


// 模块之间的隔离
export { };
